home *** CD-ROM | disk | FTP | other *** search
File List | 1989-04-27 | 34.0 KB | 822 lines |
- NOTE: This file can serve as both source and documentation. You
- can compile by stripping the 1st few lines (these notes) and
- the last portion (the cross-references), and then deleting
- the left hand 8 columns of what remains. Wordstar can do
- this column deletion, and I believe EDLIN can also. CBF
-
- NOTE: The procedural cross referencer (refrence) will not run
- with the procedure type definitions in lines 58 to 59
- below. They were commented out for the run. Thus the
- calls to readbyte and putbyte within decode are not shown.
-
- NOTE: This program has been deliberately written to isolate the
- decode operation, and make it useful in other operations.
- One anomaly with LZHUF (and LHARC) is that they become
- very slow when compressing a long string of identical
- bytes (i.e. a file full of blanks, or nuls). I believe
- this would be improved by preceding the encoding with
- run length compression, using 90h as the encodeing signal,
- so that <char> 90h nn (with 2 <= nn <= 255) represents
- <char> followed by nn repetitions, i.e. at least a total
- of nn+1 occurences of <char>. <90h 0> would represent 90h
- itself, and 90h cannot be run length encoded. <90h 1>
- would represent EOF, thus embedding a specific EOF marker
- in the file. This allows use where the actual file length
- is unknown before it is reached, i.e. in communications.
-
- NOTE: The attached LZHUFE.EXE file was compiled with the $r-
- option. However for any development etc the source should
- be compiled with $r+ (run-time range checks on) option.
- This found many evil gotchas.
-
- NOTE: LZHUFE.EXE is just as fast, within crude measurements, as
- LZHUF. This shows that even Turbo Pascals relatively
- crude code generation competes favorably with C. There
- is much room for optimization left. However I believe
- the Pascal source is much clearer than the C source.
-
- NOTE: The debug mechanism is guarded both by the Turbo {$IFDEF}
- construct, and by individual constants. The latter is
- ISO compatible. However, Turbo does not strip inaccessible
- IF statements, as does PascalP, thus the dual mechanism.
-
- 1 {$M 12000,0,0} (* see notes to "decode" *)
- 2
- 3 PROGRAM lzhufe(infile, outfile, output);
- 4 (* Based on decode section of lzhuf.c *)
- 5 (* Written by Haruyasu Yoshizaki 1988/11/20 *)
- 6 (* Some minor changes 1989/4/6 *)
- 7 (* Comments translated by Haruhiko Okumura 1989/4/7 *)
- 8
- 9 (* Converted to Pascal by C.B. Falconer, 1989/4/25 *)
- 10 (* I have attempted to use only ISO constructs, but *)
- 11 (* some Turboisms have remained, especially in the *)
- 12 (* file access area, and the use of inc/dec, hex *)
- 13 (* constants, longints, bytes and words. I have *)
- 14 (* also attempted to use the maximum range checking *)
- 15
- 16 (********** LZSS compression **********)
- 17
- 18 CONST (* These only take effect if 'dbg' is defined *)
- 19 debuga = false; (* show recorded size *)
- 20 debugb = true; (* display output chars *)
- 21
- 22 iobuffsize = 4096; (* for Turbo block i/o only *)
- 23 eofmark = $1a; (* textfile eof mark *)
- 24
- 25 (* These constants are used by the file-handling *)
- 26 (* procedures when opening and closing disk *)
- 27 (* files. The mode fields of Turbo Pascal's file *)
- 28 (* variables will contain one of these values *)
- 29 fmclosed = $d7b0;
- 30 fminput = $d7b1; (* reference data *)
- 31 fmoutput = $d7b2;
- 32 fminout = $d7b3;
- 33
- 34 TYPE
- 35 iobuffer = ARRAY[1..iobuffsize] OF byte;
- 36 iobufptr = 0..iobuffsize; (* 0 = empty *)
- 37
- 38 (* reference data, actual contents of FILE type *)
- 39 filerec = RECORD (* typed and untyped file record *)
- 40 handle : word;
- 41 mode : word;
- 42 recsize : word;
- 43 private : ARRAY[1..26] OF byte;
- 44 userdata : ARRAY[1..16] OF byte;
- 45 name : ARRAY[0..79] OF char;
- 46 END; (* filerec *)
- 47
- 48 fcb = RECORD
- 49 fid : FILE; (* Turbo untyped block i/o *)
- 50 fwrtaccess : boolean;
- 51 feof : boolean;
- 52 bufflast, (* posn of last in buffer *)
- 53 buffndx : iobufptr; (* last read from buffer *)
- 54 buff : iobuffer; (* 0 = empty *)
- 55 END; (* fcb *)
- 56
- 57 (* Non-standard method of passing procedures *)
- 58 putbproc = PROCEDURE(b : byte);
- 59 getbfunc = FUNCTION(VAR b : byte) : boolean;
- 60
- 61 VAR
- 62 infile,
- 63 outfile : fcb;
- 64 endofinput : boolean;
- 65
- 66 (* 1---------------1 *)
- 67
- 68 (* In this group we attempt to follow standard Pascal semantics *)
- 69 (* i.e. output files always have feof true, and it is an error *)
- 70 (* to write to a file without this condition. *)
- 71 (* The system is incomplete, intended for this program only. *)
- 72
- 73 FUNCTION freset(VAR f : fcb; fn : string) : boolean;
- 74 (* equivalent to assign/reset pair *)
- 75
- 76 BEGIN (* freset *)
- 77 WITH f DO BEGIN
- 78 buffndx := 0; bufflast := 0; (* mark empty *)
- 79 fwrtaccess := false;
- 80 assign(fid, fn);
- 81 {$i-} reset(fid, 1); {$i+}
- 82 feof := ioresult <> 0;
- 83 freset := NOT feof; END;
- 84 END; (* freset *)
- 85
- 86 (* 1---------------1 *)
- 87 {$F+} (* passed procs must be FAR *)
- 88 FUNCTION readbyte(VAR c : byte) : boolean;
- 89 (* assumes using infile. Returns false at eof *)
- 90
- 91 BEGIN (* readbyte *)
- 92 WITH infile DO BEGIN
- 93 IF (buffndx >= bufflast) AND NOT feof THEN BEGIN (* reload *)
- 94 {$i-} blockread(fid, buff, iobuffsize, bufflast); {$i+}
- 95 buffndx := 0;
- 96 feof := (ioresult <> 0) OR (bufflast = 0); END;
- 97 IF feof THEN c := eofmark
- 98 ELSE BEGIN
- 99 buffndx := succ(buffndx); c := buff[buffndx]; END;
- 100 readbyte := NOT feof; END;
- 101 END; (* readbyte *)
- 102 {$F-}
- 103 (* 1---------------1 *)
- 104
- 105 FUNCTION frewrite(VAR f : fcb; fn : string) : boolean;
- 106 (* equivalent to assign/rewrite pair *)
- 107
- 108 BEGIN (* frewrite *)
- 109 WITH f DO BEGIN
- 110 buffndx := 0; bufflast := 0; (* mark empty *)
- 111 fwrtaccess := true;
- 112 assign(fid, fn);
- 113 {$i-} rewrite(fid, 1); {$i+}
- 114 feof := ioresult = 0;
- 115 frewrite := feof; END;
- 116 END; (* frewrite *)
- 117
- 118 (* 1---------------1 *)
- 119
- 120 PROCEDURE fflush(VAR f : fcb);
- 121 (* empty output buffers to disk. Not checking status *)
- 122
- 123 BEGIN (* fflush *)
- 124 WITH f DO BEGIN
- 125 IF (bufflast > 0) AND feof AND fwrtaccess THEN BEGIN
- 126 {$i-} blockwrite(fid, buff, bufflast, buffndx); {$i+}
- 127 IF (ioresult <> 0) OR (buffndx <> bufflast) THEN
- 128 feof := false; (* no longer writeable *) END;
- 129 buffndx := 0; bufflast := 0; (* mark empty *) END;
- 130 END; (* fflush *)
- 131
- 132 (* 1---------------1 *)
- 133 {$F+} (* passed procs must be FAR *)
- 134 PROCEDURE putbyte(c : byte);
- 135 (* assumes using outfile *)
- 136
- 137 BEGIN (* putbyte *)
- 138 WITH outfile DO
- 139 IF fwrtaccess AND feof THEN BEGIN
- 140 inc(bufflast); buff[bufflast] := c;
- 141 IF bufflast = iobuffsize THEN fflush(outfile); END;
- 142 (* buffer cannot be full on exit *)
- 143 END; (* putbyte *)
- 144 {$F-}
- 145 (* 1---------------1 *)
- 146
- 147 PROCEDURE fclose(VAR f : fcb);
- 148
- 149 VAR
- 150 fr : filerec ABSOLUTE f; (* depends on turbo alignments *)
- 151
- 152 BEGIN (* fclose *)
- 153 WITH f DO BEGIN
- 154 IF ((fr.mode = fmoutput) OR (fr.mode = fminout)) AND feof THEN
- 155 fflush(f);
- 156 IF fr.mode <> fmclosed THEN close(fid); END;
- 157 END; (* fclose *)
- 158
- 159 (* 1---------------1 *)
- 160
- 161 PROCEDURE error(message : string);
- 162
- 163 BEGIN
- 164 writeln; writeln(message); halt(1);
- 165 END;
- 166
- 167 (* 1---------------1 *)
- 168
- 169 PROCEDURE decode(readbyte : getbfunc; (* get data *)
- 170 putbyte : putbproc; (* put data *)
- 171 monitor : boolean); (* show activity *)
- 172 (* This uses about 9k of stack space for local variables. *)
- 173 (* They might be better assigned on the heap. However that *)
- 174 (* reduces the clarity, and I wanted to isolate the decoder *)
- 175 (* Unfortunately Turbos memory scheme does not allow the *)
- 176 (* stack to expand automatically. A 16k stack suffices. *)
- 177
- 178 CONST
- 179 n = 4096; (* buffer size. Power of 2 *)
- 180 f = 60; (* lookahead buffer size *)
- 181 encodemin = 3; (* min encode string length *)
- 182 max_freq = $8000; (* updates tree when the root *)
- 183 (* frequency reaches this value.*)
- 184
- 185 (* derived constants. No expression for ISO compatibility *)
- 186 threshold = 2; (* encodemin - 1 *)
- 187 bufmax = 4155; (* n+f-1 *)
- 188 codemax = 313; (* 256-encodemin+f *)
- 189 n_char = 314; (* codemax + 1; kinds of chars *)
- 190
- 191 (* Huffman coding *)
- 192 tblsize = 627; (* 2*n_char - 1 *) (* was T *)
- 193 (* Root at tblsize, others nodes *)
- 194 huffroot = 626; (* tblsize - 1 *) (* was R *)
- 195 tblmax = 628; (* tblsize + 1 *)
- 196 parentmax = 941; (* tblsize + n_char *)
- 197
- 198 TYPE
- 199 bufindex = 0..bufmax;
- 200 charindex = 0..codemax;
- 201
- 202 VAR
- 203 i, j, k, r, c : integer;
- 204 count : longint;
- 205 textsize : longint;
- 206 printcount : longint;
- 207 getbuf : word;
- 208 getlen : byte;
- 209
- 210 (* Huffman coding *)
- 211
- 212 (* table to encode/decode the upper 6 bits of position *)
- 213 huffcode : ARRAY[0..255] OF RECORD
- 214 code, len : byte;
- 215 END; (* huffcode *)
- 216
- 217 freq : ARRAY[0..tblmax] OF word; (* freq table *)
- 218
- 219 (* pointers to parent nodes, except for *)
- 220 (* the elements[T..T + N_CHAR - 1] which *)
- 221 (* are used to get the positions of leaves *)
- 222 (* corresponding to the codes. *)
- 223 parent : ARRAY[0..parentmax] OF word;
- 224
- 225 (* pointers to child nodes (son[], son[] + 1) *)
- 226 son : ARRAY[0..tblsize] OF integer;
- 227
- 228 (* LZSS table *)
- 229 histbuff : ARRAY[bufindex] OF byte;
- 230
- 231 (* 2---------------2 *)
- 232
- 233 PROCEDURE starthuff;
- 234 (* initialization of tree *)
- 235
- 236 VAR
- 237 i : integer;
- 238 j : integer;
- 239
- 240 (* 3---------------3 *)
- 241
- 242 PROCEDURE ihuff;
- 243 (* Form decoding tables huffcode.len and huffcode.code *)
- 244 (* This replaces the original initialized data area, *)
- 245 (* and is compatible with standard Pascal. *)
- 246
- 247 VAR
- 248 i, nxtcode : integer;
- 249
- 250 (* 4---------------4 *)
- 251
- 252 PROCEDURE enter(ix, lgh : integer);
- 253
- 254 BEGIN (* enter *)
- 255 WITH huffcode[ix] DO BEGIN
- 256 len := lgh; code := nxtcode; END;
- 257 IF succ(ix) MOD (1 shl (8-lgh)) = 0 THEN
- 258 nxtcode := succ(nxtcode);
- 259 END; (* enter *)
- 260
- 261 (* 4---------------4 *)
- 262
- 263 BEGIN (* ihuff *)
- 264 nxtcode := 0;
- 265 FOR i := 0 TO 31 DO enter(i, 3);
- 266 FOR i := 32 TO 79 DO enter(i, 4);
- 267 FOR i := 80 TO 143 DO enter(i, 5);
- 268 FOR i := 144 TO 191 DO enter(i, 6);
- 269 FOR i := 192 TO 239 DO enter(i, 7);
- 270 FOR i := 240 TO 255 DO enter(i, 8);
- 271 END; (* ihuff *)
- 272
- 273 (* 3---------------3 *)
- 274
- 275 BEGIN (* starthuff *)
- 276 ihuff;
- 277 FOR i := 0 TO pred(n_char) DO BEGIN
- 278 freq[i] := 1;
- 279 son[i] := i + tblsize; parent[i + tblsize] := i; END;
- 280 i := 0; j := n_char;
- 281 WHILE (j <= huffroot) DO BEGIN
- 282 freq[j] := freq[i] + freq[succ(i)];
- 283 son[j] := i; parent[i] := j; parent[succ(i)] := j;
- 284 i := i + 2; j := succ(j); END;
- 285 freq[tblsize] := $ffff; parent[huffroot] := 0;
- 286 END; (* starthuff *)
- 287
- 288 (* 2---------------2 *)
- 289
- 290 PROCEDURE nextbyte;
- 291
- 292 VAR
- 293 c : byte;
- 294
- 295 BEGIN (* nextbyte *)
- 296 IF endofinput THEN BEGIN
- 297 fclose(outfile);
- 298 error('Read past eof'); END;
- 299 WHILE (getlen <= 8) DO BEGIN
- 300 IF NOT readbyte(c) THEN BEGIN (* delay eof for buffer *)
- 301 endofinput := true; c := 0; END;
- 302 getbuf := getbuf OR (c shl (8 - getlen));
- 303 getlen := getlen + 8; END;
- 304 END; (* nextbyte *)
- 305
- 306 (* 2---------------2 *)
- 307
- 308 FUNCTION getbit : boolean; (* get one bit *)
- 309
- 310 BEGIN (* getbit *)
- 311 IF getlen <= 8 THEN nextbyte;
- 312 getbit := (getbuf AND $8000) <> 0;
- 313 getbuf := getbuf shl 1; getlen := pred(getlen);
- 314 END; (* getbit *)
- 315
- 316 (* 2---------------2 *)
- 317
- 318 FUNCTION getbyte : integer; (* get one byte *)
- 319
- 320 BEGIN (* getbyte *)
- 321 IF getlen <= 8 THEN nextbyte;
- 322 getbyte := getbuf shr 8;
- 323 getbuf := getbuf shl 8; getlen := getlen - 8;
- 324 END; (* getbyte *)
- 325
- 326 (* 2---------------2 *)
- 327
- 328 FUNCTION decodechar : integer;
- 329
- 330 VAR
- 331 c : word;
- 332
- 333 (* 3---------------3 *)
- 334
- 335 PROCEDURE update (c : integer);
- 336 (* advance frequency of code c, and update tree *)
- 337
- 338 VAR
- 339 i, j, k, l : integer;
- 340
- 341 (* 4---------------4 *)
- 342
- 343 PROCEDURE reconst;
- 344 (* reconstruction of tree *)
- 345
- 346 VAR
- 347 i, j, k : integer;
- 348 f, l : word;
- 349
- 350 BEGIN (* reconst *)
- 351 (* collect leaf nodes in the first half of the *)
- 352 (* table and replace the freq by (freq + 1) / 2. *)
- 353 j := 0;
- 354 FOR i := 0 TO huffroot DO BEGIN
- 355 IF (son[i] >= tblsize) THEN BEGIN
- 356 freq[j] := succ(freq[i]) shr 1 (* DIV 2 *);
- 357 son[j] := son[i]; j := succ(j); END;
- 358 END;
- 359
- 360 (* begin constructing tree by connecting sons *)
- 361 i := 0;
- 362 FOR j := n_char TO huffroot DO BEGIN
- 363 k := succ(i);
- 364 f := freq[i] + freq[k]; freq[j] := f;
- 365 k := pred(j);
- 366 WHILE (f < freq[k]) DO k := pred(k);
- 367 k:= succ(k); l := (j - k) * 2;
- 368 move(freq[k], freq[k+1], l); freq[k] := f;
- 369 move(son[k], son[k+1], l); son[k] := i;
- 370 i := i + 2; END;
- 371
- 372 (* connect parent *)
- 373 FOR i := 0 TO huffroot DO BEGIN
- 374 k := son[i]; parent[k] := i;
- 375 IF k < tblsize THEN parent[succ(k)] := i; END;
- 376 END; (* reconst *)
- 377
- 378 (* 4---------------4 *)
- 379
- 380 BEGIN (* update *)
- 381 IF (freq[tblmax] = max_freq) THEN reconst;
- 382 c := parent[c + tblsize];
- 383 REPEAT
- 384 k := succ(freq[c]); freq[c] := k;
- 385 (* if the order is disturbed, exchange nodes *)
- 386 l := succ(c);
- 387 IF (k > freq[l]) THEN BEGIN
- 388 REPEAT
- 389 inc(l);
- 390 UNTIL k <= freq[l];
- 391 dec(l);
- 392
- 393 freq[c] := freq[l]; freq[l] := k;
- 394
- 395 i := son[c]; parent[i] := l;
- 396 IF (i < tblsize) THEN parent[succ(i)] := l;
- 397 j := son[l]; son[l] := i;
- 398
- 399 parent[j] := c;
- 400 IF (j < tblsize) THEN parent[succ(j)] := c;
- 401 son[c] := j;
- 402
- 403 c := l; END;
- 404 c := parent[c];
- 405 UNTIL c = 0; (* repeat up to root *)
- 406 END; (* update *)
- 407
- 408 (* 3---------------3 *)
- 409
- 410 BEGIN (* decodechar *)
- 411 c := son[huffroot];
- 412 (* travel from root to leaf, choosing the smaller *)
- 413 (* child node (son[]) if the read bit is 0, the *)
- 414 (* bigger (son[] +1; if the read bit is 1 *)
- 415 WHILE (c < tblsize) DO c := son[c + ord(getbit)];
- 416 c := c - tblsize;
- 417 update(c); decodechar := c;
- 418 END; (* decodechar *)
- 419
- 420 (* 2---------------2 *)
- 421
- 422 FUNCTION decodeposition : integer;
- 423
- 424 VAR
- 425 i, j, c : word;
- 426
- 427 BEGIN (* decodeposition *)
- 428 (* recover upper 6 bits from table *)
- 429 i := getbyte;
- 430 WITH huffcode[i] DO BEGIN
- 431 c := code shl 6; j := len; END;
- 432 (* read lower 6 bits verbatim *)
- 433 (* comment/code dont match *)
- 434 dec(j, 2);
- 435 WHILE j <> 0 DO BEGIN
- 436 dec(j); i := i + i + ord(getbit); END;
- 437 decodeposition := c OR (i AND $3f);
- 438 END; (* decodeposition *)
- 439
- 440 (* 2---------------2 *)
- 441
- 442 FUNCTION readlong : longint;
- 443 (* Read 4 bytes, convert into LSByte 1st 32 bit integer *)
- 444
- 445 VAR
- 446 i : integer;
- 447 buff : RECORD
- 448 CASE boolean OF
- 449 false : ( long : longint);
- 450 true : ( bytes : ARRAY[0..3] OF byte);
- 451 END; (* buff record *)
- 452
- 453 BEGIN (* readlong *)
- 454 FOR i := 0 TO 3 DO
- 455 IF NOT readbyte(buff.bytes[i]) THEN buff.long := 0;
- 456 readlong := buff.long;
- 457 END; (* readlong *)
- 458
- 459 (* 2---------------2 *)
- 460
- 461 BEGIN (* decode *)
- 462 textsize := 0; printcount := 0; count := 0;
- 463 getbuf := 0; getlen := 0;
- 464 textsize := readlong; (* header is size of text *)
- 465 IF textsize > 0 THEN BEGIN
- 466 {$IFDEF dbg}
- 467 IF debuga THEN writeln('Size=', textsize);
- 468 {$ENDIF}
- 469 starthuff;
- 470 FOR i := 0 TO n - f - 1 DO (* prefill with common char *)
- 471 histbuff[i] := ord(' ');
- 472 r := n - f;
- 473
- 474 WHILE count < textsize DO BEGIN
- 475 c := decodechar;
- 476 IF (c < 256) THEN BEGIN (* a verbatim character *)
- 477 {$IFDEF dbg}
- 478 IF debugb THEN write(chr(c));
- 479 {$ENDIF}
- 480 putbyte(c);
- 481 histbuff[r] := c; (* record in history buff *)
- 482 r := succ(r) AND pred(n); (* advance MODULO n *)
- 483 inc(count); END
- 484 ELSE BEGIN (* posn/lgh in buffer *)
- 485 i := pred(r - decodeposition) AND pred(n);
- 486 j := c - 255 + threshold;
- 487 {$IFDEF dbg}
- 488 IF debugb THEN write('<', j, '>'); (* show size *)
- 489 {$ENDIF}
- 490 FOR k := 0 TO j - 1 DO BEGIN (* copy the string *)
- 491 c := histbuff[(i + k) AND pred(n)];
- 492 {$IFDEF dbg}
- 493 IF debugb THEN write(chr(c));
- 494 {$ENDIF}
- 495 putbyte(c);
- 496 histbuff[r] := c; (* revising the buffer *)
- 497 r := succ(r) AND pred(n); inc(count); END;
- 498 END;
- 499 IF monitor AND (count > printcount) THEN BEGIN
- 500 write(count : 12, #13); (* show progress *)
- 501 printcount := printcount + 1024; END;
- 502 END;
- 503 END;
- 504 IF monitor THEN writeln(count : 12);
- 505 END; (* decode *)
- 506
- 507 (* 1---------------1 *)
- 508
- 509 BEGIN (* lzhufe *)
- 510 filemode := 0; (* so Turbo handles r/o files *)
- 511 IF paramcount <> 2 THEN BEGIN
- 512 writeln('Decodes files encoded by LZHUF');
- 513 error('Usage: lzhufe infile outfile'); END
- 514 ELSE IF NOT freset(infile, paramstr(1)) THEN
- 515 error('Can''t open: ' + paramstr(1))
- 516 ELSE BEGIN
- 517 endofinput := false;
- 518 IF NOT frewrite(outfile, paramstr(2)) THEN BEGIN
- 519 error('Can''t create: ' + paramstr(2)); END
- 520 ELSE BEGIN
- 521 decode(readbyte, putbyte, true); (* do the real work *)
- 522 fclose(outfile); END;
- 523 fclose(infile); END;
- 524 END. (* lzhufe *)
-
- Files cross referenced on 1989 Apr 27 8:18 :
- lzhufe.pas
-
- IDENTIFIER OCCURRENCES
- ========== ===========
- absolute 150
- assign 80 112
- b 58 59
- blockread 94
- blockwrite 126
- boolean 50 51 59 64 73 88 105 171
- . 308 448
- buff 54 94 99 126 140 447 455 456
- bufflast 52 78 93 94 96 110 125 126
- . 127 129 140 141
- buffndx 53 78 93 95 99 110 126 127
- . 129
- bufindex 199 229
- bufmax 187 199
- byte 35 43 44 58 59 88 134 208
- . 214 229 293 450
- bytes 450 455
- c 88 97 99 134 140 203 293 300
- . 301 302 331 335 382 384 386 393
- . 395 399 400 401 403 404 405 411
- . 415 416 417 425 431 437 475 476
- . 478 480 481 486 491 493 495 496
- char 45
- charindex 200
- chr 478 493
- close 156
- code 214 256 431
- codemax 188 200
- count 204 462 474 483 497 499 500 504
- debuga 19 467
- debugb 20 478 488 493
- dec 391 434 436
- decode 169 521
- decodechar 328 417 475
- decodeposition 422 437 485
- encodemin 181
- endofinput 64 296 301 517
- enter 252 265 266 267 268 269 270
- eofmark 23 97
- error 161 298 513 515 519
- f 73 77 105 109 120 124 147 150
- . 153 155 180 348 364 366 368 470
- . 472
- false 19 79 128 449 517
- fcb 48 63 73 105 120 147
- fclose 147 297 522 523
- feof 51 82 83 93 96 97 100 114
- . 115 125 128 139 154
- fflush 120 141 155
- fid 49 80 81 94 112 113 126 156
- filemode 510
- filerec 39 150
- fmclosed 29 156
- fminout 32 154
- fminput 30
- fmoutput 31 154
- fn 73 80 105 112
- fr 150 154 156
- freq 217 278 282 285 356 364 366 368
- . 381 384 387 390 393
- freset 73 83 514
- frewrite 105 115 518
- fwrtaccess 50 79 111 125 139
- getbfunc 59 169
- getbit 308 312 415 436
- getbuf 207 302 312 313 322 323 463
- getbyte 318 322 429
- getlen 208 299 302 303 311 313 321 323
- . 463
- halt 164
- handle 40
- histbuff 229 471 481 491 496
- huffcode 213 255 430
- huffroot 194 281 285 354 362 373 411
- i 203 237 248 265 266 267 268 269
- . 270 277 278 279 280 282 283 284
- . 339 347 354 355 356 357 361 363
- . 364 369 370 373 374 375 395 396
- . 397 425 429 430 436 437 446 454
- , 455 470 471 485 491
- ihuff 242 276
- inc 140 389 483 497
- infile 3 62 92 514 523
- integer 203 226 237 238 248 252 318 328
- . 335 339 347 422 446
- iobuffer 35 54
- iobuffsize 22 35 36 94 141
- iobufptr 36 53
- ioresult 82 96 114 127
- ix 252 255 257
- j 203 238 280 281 282 283 284 339
- . 347 353 356 357 362 364 365 367
- . 397 399 400 401 425 431 434 435
- . 436 486 488 490
- k 203 339 347 363 364 365 366 367
- . 368 369 374 375 384 387 390 393
- . 490 491
- l 339 348 367 368 369 386 387 389
- . 390 391 393 395 396 397 403
- len 214 256 431
- lgh 252 256 257
- long 449 455 456
- longint 204 205 206 442 449
- lzhufe 3
- max_freq 182 381
- message 161 164
- mode 41 154 156
- monitor 171 499 504
- move 368 369
- n 179 470 472 482 485 491 497
- n_char 189 277 280 362
- name 45
- nextbyte 290 311 321
- nxtcode 248 256 258 264
- ord 415 436 471
- outfile 3 63 138 141 297 518 522
- output 3
- paramcount 511
- paramstr 514 515 518 519
- parent 223 279 283 285 374 375 382 395
- . 396 399 400 404
- parentmax 196 223
- pred 277 313 365 366 482 485 491 497
- printcount 206 462 499 501
- private 43
- putbproc 58 170
- putbyte 134 170 480 495 521
- r 203 472 481 482 485 496 497
- readbyte 88 100 169 300 455 521
- readlong 442 456 464
- reconst 343 381
- recsize 42
- reset 81
- rewrite 113
- shl 257 302 313 323 431
- shr 322 356
- son 226 279 283 355 357 369 374 395
- . 397 401 411 415
- starthuff 233 469
- string 73 105 161
- succ 99 257 258 282 283 284 356 357
- . 363 367 375 384 386 396 400 482
- . 497
- tblmax 195 217 381
- tblsize 192 226 279 285 355 375 382 396
- . 400 415 416
- textsize 205 462 464 465 467 474
- threshold 186 486
- true 20 111 301 450 521
- update 335 417
- userdata 44
- word 40 41 42 207 217 223 331 348
- . 425
- write 478 488 493 500
- writeln 164 467 504 512
-
- 124 Identifiers 728 Occurences
- 1 Collisions 2 Misses
-
- Procedural Cross-Referencer - Version T2.0
- ==========================================
-
- Line Program/procedure/function heading
- -------------------------------------------
-
- 3 PROGRAM lzhufe(infile, outfile, output);
- 73 FUNCTION freset(VAR f : fcb; fn : string) : boolean;
- 88 FUNCTION readbyte(VAR c : byte) : boolean;
- 105 FUNCTION frewrite(VAR f : fcb; fn : string) : boolean;
- 120 PROCEDURE fflush(VAR f : fcb);
- 134 PROCEDURE putbyte(c : byte);
- 147 PROCEDURE fclose(VAR f : fcb);
- 161 PROCEDURE error(message : string);
- 169 PROCEDURE decode(readbyte : getbfunc; (* get data *)
- 170 putbyte : putbproc; (* put data *)
- 171 monitor : boolean); (* show activity *)
- 233 PROCEDURE starthuff;
- 242 PROCEDURE ihuff;
- 252 PROCEDURE enter(ix, lgh : integer);
- 290 PROCEDURE nextbyte;
- 308 FUNCTION getbit : boolean; (* get one bit *)
- 318 FUNCTION getbyte : integer; (* get one byte *)
- 328 FUNCTION decodechar : integer;
- 335 PROCEDURE update (c : integer);
- 343 PROCEDURE reconst;
- 422 FUNCTION decodeposition : integer;
- 442 FUNCTION readlong : longint;
- 524 END. (* lzhufe *)
-
-
- Procedural Cross-Referencer - Version T2.0
- ==========================================
-
- Head Body Notes Calls made to
- ------------------------------------------------------
- 169 461 decode : readlong starthuff
- decodechar decodeposition
- 328 410 decodechar : getbit update
- 422 427 decodeposition : getbyte getbit
- 252 254 enter :
- 161 163 error :
- 147 152 fclose : fflush
- 120 123 fflush :
- 73 76 freset :
- 105 108 frewrite :
- 308 310 getbit : nextbyte
- 318 320 getbyte : nextbyte
- 242 263 ihuff : enter
- 3 509 lzhufe : error freset
- frewrite decode
- readbyte putbyte
- fclose
- 290 295 nextbyte : fclose error
- 134 137 putbyte : fflush
- 88 91 readbyte :
- 442 453 readlong :
- 343 350 reconst :
- 233 275 starthuff : ihuff
- 335 380 update : reconst
-
-
- Procedural Cross-Referencer - Version T2.0
- ==========================================
-
- Head Body Notes Called by
- ------------------------------------------------------
- 169 461 decode : lzhufe
- 328 410 decodechar : decode
- 422 427 decodeposition : decode
- 252 254 enter : ihuff
- 161 163 error : nextbyte lzhufe
- 147 152 fclose : nextbyte lzhufe
- 120 123 fflush : putbyte fclose
- 73 76 freset : lzhufe
- 105 108 frewrite : lzhufe
- 308 310 getbit : decodechar decodeposition
- 318 320 getbyte : decodeposition
- 242 263 ihuff : starthuff
- 3 509 lzhufe :
- 290 295 nextbyte : getbit getbyte
- 134 137 putbyte : lzhufe
- 88 91 readbyte : lzhufe
- 442 453 readlong : decode
- 343 350 reconst : update
- 233 275 starthuff : decode
- 335 380 update : decodechar
-
- Files scanned on 1989 Apr 27 8:19
- lzhufe.pas
- àê